রিকার্সন (Recursion) হলো এমন একটি প্রোগ্রামিং কৌশল, যেখানে একটি ফাংশন নিজেই নিজেকে বারবার ডাকে, যতক্ষণ না কোনো নির্দিষ্ট শর্ত পূরণ হয়। এটি সাধারণত জটিল সমস্যাগুলিকে সহজে এবং স্বাভাবিকভাবে সমাধান করতে ব্যবহৃত হয়। রিকার্সন একটি সমস্যাকে ছোট ছোট উপ-সমস্যায় বিভক্ত করে, যতক্ষণ না সমস্যাটি সমাধানযোগ্য অবস্থায় পৌঁছায়।
রিকার্সনের মূল ধারণা
রিকার্সন সাধারণত দুইটি অংশে বিভক্ত:
- বেস কেস (Base Case): যেখানে রিকার্সন বন্ধ হয়। এটি সেই শর্ত যা পূরণ হলে ফাংশন আর নিজেকে ডাকে না।
- রিকার্সিভ কেস (Recursive Case): যেখানে ফাংশন নিজেকে পুনরায় ডাকে। মূল সমস্যাটিকে ছোট ছোট অংশে ভাগ করে সমাধান করে।
উদাহরণ: ফ্যাক্টোরিয়াল নির্ণয়
\( n! = n \times (n-1) \times (n-2) \times ... \times 1 \)
ফ্যাক্টোরিয়াল নির্ণয়ের ক্ষেত্রে আমরা দেখতে পাই যে \( n! = n \times (n-1)! \)। এখানে ফ্যাক্টোরিয়াল নির্ণয় করতে প্রতিবার একটি করে সংখ্যা কমে যায়, যা রিকার্সনের জন্য উপযুক্ত উদাহরণ।
def factorial(n):
if n == 1: # বেস কেস
return 1
else:
return n * factorial(n - 1) # রিকার্সিভ কেস
এখানে:
- বেস কেস: যদি
nএর মান1হয়, তখন1রিটার্ন করে। - রিকার্সিভ কেস:
n * factorial(n - 1)এর মাধ্যমে ফাংশন নিজেই নিজেকে ডাকে যতক্ষণ নাnএর মান1হয়।
ফাংশন কলের উদাহরণ:
print(factorial(5)) # আউটপুট: 120
রিকার্সনের ব্যবহারিক প্রয়োগ
রিকার্সন সাধারণত নিম্নোক্ত ক্ষেত্রগুলোতে ব্যবহৃত হয়:
- ফ্যাক্টোরিয়াল নির্ণয়
- ফিবোনাচি সিরিজ গণনা
- ডেটা স্ট্রাকচার ট্রাভার্সাল (যেমন: ট্রি বা গ্রাফ)
- বাইনারি সার্চ
- টাওয়ার অব হ্যানয় সমাধান
ফিবোনাচি সিরিজ গণনা (Recursion)
ফিবোনাচি সিরিজ হলো এমন একটি ক্রম যেখানে প্রতিটি সংখ্যা তার আগের দুইটি সংখ্যার যোগফল। অর্থাৎ, ফিবোনাচি সিরিজের জন্য সূত্র হচ্ছে:
F(n)=F(n−1)+F(n−2)F(n) = F(n-1) + F(n-2)F(n)=F(n−1)+F(n−2)
উদাহরণ:
def fibonacci(n):
if n <= 1: # বেস কেস
return n
else:
return fibonacci(n - 1) + fibonacci(n - 2) # রিকার্সিভ কেস
ফাংশন কলের উদাহরণ:
print(fibonacci(5)) # আউটপুট: 5
এখানে:
- বেস কেস: যদি
nএর মান1বা0হয়, তবেnরিটার্ন করা হয়। - রিকার্সিভ কেস:
fibonacci(n - 1) + fibonacci(n - 2)এর মাধ্যমে নিজেকে ডেকে যোগফল প্রদান করে।
টাওয়ার অব হ্যানয় (Tower of Hanoi)
টাওয়ার অব হ্যানয় একটি বিখ্যাত সমস্যা যেখানে বিভিন্ন আকারের ডিস্ক একটি পেগ থেকে অন্য পেগে সরানো হয়, একটি নির্দিষ্ট নিয়ম মেনে। এটি একটি ক্লাসিক রিকার্সিভ সমস্যা যেখানে বড় সমস্যা ছোট ছোট সমস্যায় বিভক্ত করা হয়।
উদাহরণ:
def hanoi(n, source, auxiliary, target):
if n == 1:
print(f"Move disk 1 from {source} to {target}")
else:
hanoi(n - 1, source, target, auxiliary)
print(f"Move disk {n} from {source} to {target}")
hanoi(n - 1, auxiliary, source, target)
ফাংশন কলের উদাহরণ:
python
Copy code
hanoi(3, 'A', 'B', 'C')
এখানে:
n: মোট ডিস্ক সংখ্যাsource: প্রথম পেগauxiliary: মধ্যবর্তী পেগtarget: লক্ষ্য পেগ
রিকার্সনের সুবিধা
- জটিল সমস্যা সমাধান সহজ: বড় সমস্যাকে ছোট ছোট সমস্যায় ভাগ করে সমাধান করা সহজ হয়।
- কোডের পাঠযোগ্যতা বৃদ্ধি: কোড সংক্ষিপ্ত এবং সহজে পড়া যায়।
- মাল্টি-লেভেল ডেটা প্রক্রিয়াকরণে উপযোগী: যেমন ট্রি এবং গ্রাফ ট্রাভার্সাল।
রিকার্সনের অসুবিধা
- স্ট্যাক ওভারফ্লো (Stack Overflow): অতিরিক্ত রিকার্সন হলে মেমোরিতে স্ট্যাক ওভারফ্লো হতে পারে।
- কম কার্যকারিতা: কিছু ক্ষেত্রে রিকার্সন বেশি সময় ও মেমোরি খরচ করে।
- কিছু সমস্যা পুনরাবৃত্তিমূলকভাবে সমাধান করা ভালো: কিছু সমস্যা ইটারেটিভ পদ্ধতিতে সমাধান করা বেশি কার্যকর।
উপসংহার
রিকার্সন একটি শক্তিশালী টুল, যা বড় সমস্যাকে ছোট ছোট উপ-সমস্যায় ভাগ করে সমাধান করে। এটি সাধারণত ফ্যাক্টোরিয়াল, ফিবোনাচি, টাওয়ার অব হ্যানয়, এবং ট্রি ট্রাভার্সালের মতো সমস্যা সমাধানে ব্যবহার হয়। তবে এটি ব্যবহারে স্ট্যাক ওভারফ্লো এবং অতিরিক্ত মেমোরি ব্যবহারের ঝুঁকি থাকে।
Read more